package BL;

import BE.*;
import DA.DAProducto;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class BLProducto
{


     public void actualizarStock (int prod, int cantidad){
         DAProducto dAProd = new DAProducto();
         dAProd.actualizarStock(prod, cantidad);
     }
    //MANEJO DE TABLA MANTENIMIENTO
    public void buscaProd (String nombre, int idEstado,int idTipo,
                           int idProveedor,JTable tblDatos, int tipoBusqueda)
    {
        DAProducto dAProd = new DAProducto();
        ResultSet rs = null;

        BEProducto producto = new BEProducto();
        producto.setNombre(nombre);
        producto.setIdTipoProducto(idTipo);
        producto.setIdProveedor(idProveedor);
        producto.setEstado(idEstado);

        rs = dAProd.buscarProd(producto,tipoBusqueda); //1 para buscar por parametros de busqueda
        this.llenaTabla(rs, tblDatos);
    }
    
    public void llenaTabla (ResultSet rs, JTable tblDatos)
    {
        BLModelo modelo = new BLModelo();
        tblDatos.setModel(modelo);

        modelo.addColumn("IDProducto");
        modelo.addColumn("Producto");
        modelo.addColumn("Tipo");
        modelo.addColumn("Stock");
        modelo.addColumn("Proveedor");
        modelo.addColumn("Descripcion");
        modelo.addColumn("Estado");
        //Ocultar columna ID
        tblDatos.getColumnModel().getColumn(0).setMaxWidth(0);
        tblDatos.getColumnModel().getColumn(0).setMinWidth(0);
        tblDatos.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0);
        tblDatos.getTableHeader().getColumnModel().getColumn(0).setMinWidth(0);

        try
        {
            while (rs.next())
            {
                Object [] fila = new Object[7];
                fila[0] = rs.getObject("IDPRODUCTO");
                fila[1] = rs.getObject("NOMBRE");
                fila[2] = rs.getObject("TIPO");
                fila[3] = rs.getObject("CANTIDAD");
                fila[4] = rs.getObject("NOMBEMPRESA");
                fila[5] = rs.getObject("DESCRIPCION");
                fila[6] = rs.getObject("ESTADO");

                if (fila[6].toString().equals("1"))
                    fila[6] = "ACTIVO";
                else 
                    fila[6] = "INACTIVO";
                modelo.addRow(fila);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Error al llenar la tabla",
                                          "Error",JOptionPane.ERROR_MESSAGE);
        }
    }

    public void limpiaTabla (JTable tblDatos)
    {
        DefaultTableModel modelo = new BLModelo();
        tblDatos.setModel(modelo);

        modelo.addColumn("Producto");
        modelo.addColumn("Tipo");
        modelo.addColumn("Stock");
        modelo.addColumn("Proveedor");
        modelo.addColumn("Descripcion");
        modelo.addColumn("Estado");
    }

    public int getTipoProdbyId (int idProd)
    {
        DAProducto daProd = new DAProducto();
        return daProd.getTipoProdbyId(idProd);
    }
    //AGREGAR PRODUCTO
    public void llenarTablaTipoPallet(JTable tblDatos)
    {
        DAProducto daProducto = new DAProducto();
        List<BETipoPaleta> tipos = daProducto.obtenerTipoPallets();

        DefaultTableModel modelo = (DefaultTableModel) tblDatos.getModel();
        modelo.addColumn("IDTIPOPALETA");

        tblDatos.getColumnModel().getColumn(2).setMaxWidth(0);
        tblDatos.getColumnModel().getColumn(2).setMinWidth(0);
        tblDatos.getTableHeader().getColumnModel().getColumn(2).setMaxWidth(0);
        tblDatos.getTableHeader().getColumnModel().getColumn(2).setMinWidth(0);

        if (tipos != null)
            for (int i=0;i<tipos.size();i++)
            {
                Object [] fila = new Object[3];
                fila[2] = tipos.get(i).getIdTipoPaleta();
                fila[0] = tipos.get(i).getNombre();
                fila[1] = "";

                modelo.addRow(fila);
            }
    }

    public  int agregaProducto(String nombre, JTable tblCantidad, int idTipo,
                                int idProveedor, String descp, String stock, String factor)
    {
        BEProducto beProd = new BEProducto();
        DAProducto daProd = new DAProducto();
        BLValidaciones validar = new BLValidaciones();
        List<BEProductoxTipoPallet> listPxT = new ArrayList<BEProductoxTipoPallet>();
        BEProductoxTipoPallet bePxT = null;
        boolean procede = false;

        for(int i=0;i<tblCantidad.getRowCount();i++)
            if (!tblCantidad.getModel().getValueAt(i,1).toString().equals(""))
            {
                procede = true;
                bePxT = new BEProductoxTipoPallet();
                bePxT.setCantidad(Integer.parseInt(tblCantidad.getModel().getValueAt(i,1).toString()));
                bePxT.setIdTipoPallet(Integer.parseInt(tblCantidad.getModel().getValueAt(i,2).toString()));
                listPxT.add(bePxT);
            }
        
        double factorVencimiento = 0;
        if (!factor.equals(""))
            factorVencimiento= Double.parseDouble(factor);
        
        if (nombre.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir un nombre para el producto",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (!procede)
            JOptionPane.showMessageDialog(null,"Debe elegir al menos una cantidad\n"
                                             + "en el campo Capacidad","Error",
                                             JOptionPane.ERROR_MESSAGE);
        else if (idTipo == 0)
            JOptionPane.showMessageDialog(null,"Debe elegir un tipo de producto",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (idProveedor == 0)
            JOptionPane.showMessageDialog(null,"Debe elegir un proveedor",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (daProd.existeNombre(validar.validarSqlInjection(nombre)))
            JOptionPane.showMessageDialog(null,"El nombre de producto ya existe",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (stock.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir un stock mínimo para el producto",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (factor.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir un factor de vencimiento para el producto",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (!(factorVencimiento >= 1 && factorVencimiento <= 2))
            JOptionPane.showMessageDialog(null,"El factor debe estar entre 1 y 2",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else
            if (JOptionPane.showConfirmDialog(null,"¿Desea agregar el producto?",
                "Confirmacion",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE) == 0)
            {
                beProd.setIdProveedor(idProveedor);
                beProd.setIdTipoProducto(idTipo);
                beProd.setNombre(validar.validarSqlInjection(nombre));
                beProd.setDescripcion(validar.validarSqlInjection(descp));
                beProd.setStockMin(Integer.parseInt(stock));
                beProd.setFactorVencimiento(Double.parseDouble(factor));

                return daProd.agregarProducto(beProd,listPxT);
            }

        return 1;
    }

    //ELIMINAR PRODUCT
    public void eliminarProd (JTable tblDatos,BEUsuario objUsuario)
    {
        int retorno = 1;
        int fila;
        int columna = 0;
        int idProd=0;
        DAProducto daProducto = new DAProducto();

        fila = tblDatos.getSelectedRow();

        if (fila < 0)
            JOptionPane.showMessageDialog(null,"Debe seleccionar un producto para eliminar",
                                          "Informacion",JOptionPane.INFORMATION_MESSAGE);
        else if (tblDatos.getModel().getValueAt(fila,6).toString().equals("INACTIVO"))
            JOptionPane.showMessageDialog(null,"El producto ya se encuentra INACTIVO",
                                          "Error",JOptionPane.ERROR_MESSAGE);
        else if (JOptionPane.showConfirmDialog(null,"¿Desea eliminar el producto?",
                 "Confirmacion",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE) == 0)
        {
            idProd = Integer.parseInt(tblDatos.getModel().getValueAt(fila,columna).toString());
            retorno = daProducto.eliminarProd(idProd);
        }

        if (retorno == 0)
        {
            
            BEProducto producto = getProdbyId(idProd);
            
            BLLogAudit objgestorAdit = new BLLogAudit();
            BELogAudit objlogAudit= new BELogAudit();
            
            objlogAudit.setIdUsuario(objUsuario.getIdUsuario());
            objlogAudit.setIdInterface(0);
            objlogAudit.setIdUsuario(objUsuario.getIdUsuario());
            objlogAudit.setAccion("Eliminacion del producto "+ producto.getNombre() +"por el usuario "+objUsuario.getUsuario()+"." );
            Date aux= new Date();
            Timestamp fecha= new Timestamp(aux.getTime());
            
            objlogAudit.setFecha(fecha);
            
            objgestorAdit.registrarAccion(objlogAudit);
            
            
            JOptionPane.showMessageDialog(null,"Se eliminó el producto ",
                                          "Información",JOptionPane.INFORMATION_MESSAGE);
            this.limpiaTabla(tblDatos);
            this.buscaProd("",0,0,0,tblDatos,0);
        }
    }
    
    //MODIFICA PRODUCTO
    public BEProducto getProdbyId (int idProd)
    {
        DAProducto daProd = new DAProducto();
        BEProducto producto = daProd.getProdbyId(idProd);

        return producto;
    }

    public void llenaTablaCantidad (JTable tblDatos, int idProd)
    {
        DAProducto daProducto = new DAProducto();
        List<BEProductoxTipoPallet> tipos = daProducto.getPxTbyIdProd(idProd);

        for(int i=0;i<tblDatos.getRowCount();i++)
            for(int j=0;j<tipos.size();j++)
                if(tipos.get(j).getIdTipoPallet() ==
                   Integer.parseInt(tblDatos.getModel().getValueAt(i,2).toString()))
                {
                    tblDatos.getModel().setValueAt(tipos.get(j).getCantidad(),i,1);
                    break;
                }
    }

    public int modificaProducto (BEProducto prod, boolean cambio)
    {
        int retorno = 1;
        DAProducto daProd = new DAProducto();

        if (prod.getNombre().equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir un nombre para el producto",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (daProd.existeNombre(prod.getNombre()) && cambio)
            JOptionPane.showMessageDialog(null,"El nombre de producto ya existe",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else
            if (JOptionPane.showConfirmDialog(null,"¿Desea editar el producto?",
                "Confirmacion",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE) == 0)
            {
                retorno = daProd.modificaProducto(prod);
            }

        return retorno;
    }
    
    public double getFactor(int idProducto)
    {
        double factor;
        DAProducto daProducto = new DAProducto();
        factor = daProducto.getFactor(idProducto);
        
        return factor;
    }
    
    //################################
    
      public List<BEProducto> listaProductos (){
            DAProducto daProducto = new DAProducto();
            return daProducto.listaProductos();
      }
 
    public void setZonas(JComboBox cmbZonas)
    {
        DAProducto daProd = new DAProducto();
        List<BEZona> zonas = new ArrayList<BEZona>();

        zonas = daProd.obtenerZonas();

        cmbZonas.addItem(new BLCombo(0,"TODOS"));
        if (zonas != null)
            for (int i=0;i<zonas.size();i++)
                cmbZonas.addItem(new BLCombo(zonas.get(i).getIdZona(),
                                     zonas.get(i).getNombre()));

    }

    //ELIMINAR FUNCION
    public void setTipoProd(JComboBox cmbTiposProd, int tipoCombo)
    {
        DAProducto daProd = new DAProducto();
        List<BETipoProducto> tipos = new ArrayList<BETipoProducto>();

        tipos = daProd.obtenerTipoProd();

        if (tipoCombo == 0)
            cmbTiposProd.addItem(new BLCombo(0,"TODOS"));
        else
            cmbTiposProd.addItem(new BLCombo(0,"SELECCIONAR"));
        if (tipos != null)
            for (int i=0;i<tipos.size();i++)
                cmbTiposProd.addItem(new BLCombo(tipos.get(i).getIdTipoProd(),
                                     tipos.get(i).getTipo()));

    }
    
    public void setTipoProveedores(JComboBox cmbProveedor)
    {
        DAProducto daProd = new DAProducto();
        List<BEProducto> proveedores = new ArrayList<BEProducto>();

        proveedores = daProd.obtenerProveedores();

        cmbProveedor.addItem(new BLCombo(0,"SELECCIONAR"));
        if (proveedores != null)
            for (int i=0;i<proveedores.size();i++)
                cmbProveedor.addItem(new BLCombo(proveedores.get(i).getIdProveedor(),
                                     proveedores.get(i).getNombre()));

    }

    public int getIdProveedor (int idProd)
    {
        DAProducto dAProducto = new DAProducto();
        return dAProducto.getIdProveedor(idProd);
    }


 public int getCantidad (int idProd){
       DAProducto dAProducto = new DAProducto();
        return dAProducto.getCantidad(idProd);

 }




     public void llenarCombo(JComboBox cmbTipoMovimiento){
         BLProducto blproducto = new BLProducto();
        List<BEProducto> productos = new ArrayList<BEProducto>();

        productos = blproducto.listaProductos();


            cmbTipoMovimiento.addItem(new BLCombo(0,"TODOS"));

        if (productos != null)
            for (int i=0;i<productos.size();i++)
                cmbTipoMovimiento.addItem(new BLCombo(productos.get(i).getIdProducto(),
                                     productos.get(i).getNombre()));

    }


     public BEProducto llenaVentana (int id)
    {
        DAProducto daContacto = new DAProducto();
        BEProducto contacto = daContacto.getProdbyId(id);

        return contacto;
    }

    void agregarProductoCargaMasiva(BEProducto pro, ArrayList<BEProductoxTipoPallet> lstProdxTipoPalleta) {
        DAProducto daProducto = new DAProducto();
        daProducto.agregarProductoCargaMasiva(pro, lstProdxTipoPalleta);
    }

}
